package com.sanbi.shield.server.facade.enums;

import com.sanbi.shield.server.facade.utils.DateUtils;
import lombok.Getter;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.Map;
import java.util.TimeZone;
import java.util.stream.Collectors;

/**
 * 国家信息枚举
 *
 * @author XiaoQingqing
 * @since 2024/08/20
 */
@Getter
public enum CountryInfoEnum {
    CN(45, TimeZone.getTimeZone("GMT+8:00").toZoneId(),"中国"),
    MX(142, TimeZone.getTimeZone("GMT-6:00").toZoneId(),"墨西哥"),
    ZA(202, TimeZone.getTimeZone("GMT+2:00").toZoneId(),"南非"),
    ;

    /**
     * 国家ID
     */
    private final int id;
    /**
     * 国家所在时区
     */
    private final ZoneId zoneId;
    /**
     * 国家中文名称
     */
    private final String cnName;
    /**
     * 枚举缓存
     */
    private static final Map<Integer, CountryInfoEnum> cache;

    static {
        cache = Arrays.stream(CountryInfoEnum.values()).collect(Collectors.toMap(CountryInfoEnum::getId, e -> e));
    }

    /**
     * 构造器
     *
     * @param id     国家ID
     * @param zoneId 国家所在时区
     * @param cnName 国家中文名称
     */
    CountryInfoEnum(int id, ZoneId zoneId, String cnName) {
        this.id = id;
        this.zoneId = zoneId;
        this.cnName = cnName;
    }

    /**
     * 根据国家ID获取枚举
     *
     * @param id 国家ID
     * @return 枚举
     */
    public static CountryInfoEnum getById(Integer id) {
        return cache.get(id);
    }

    /**
     * 格式化时间
     *
     * @param localDateTime 时间
     * @param formatter     格式
     * @return 格式化时间字符串
     */
    public String formatFromGMT(LocalDateTime localDateTime, DateTimeFormatter formatter){
        return DateUtils.formatFromGMT(localDateTime, this.getZoneId(), formatter);
    }

    /**
     * 以零时区为基准格式化时间
     *
     * @param countryId     国家ID
     * @param localDateTime 时间
     * @param formatter     格式
     * @return 格式化时间字符串
     */
    public static String formatFromGMT(Integer countryId, LocalDateTime localDateTime, DateTimeFormatter formatter){
        CountryInfoEnum countryInfo = getById(countryId);
        if(null == countryInfo){
            return null;
        }
        return countryInfo.formatFromGMT(localDateTime, formatter);
    }
}
